var createError = require('http-errors')
var express = require('express')
var path = require('path')
const fs = require('fs')
var cookieParser = require('cookie-parser')
var logger = require('morgan')
const session = require('express-session')
const RedisStore = require('connect-redis')(session)

var indexRouter = require('./routes/index')
var usersRouter = require('./routes/users')
const blogRouter = require('./routes/blog')
const userRouter = require('./routes/user')

var app = express()

// view engine setup
// node.js的动态Html渲染，类似java的jsp页面 和c#的asp页面(一般只做后端应用，不做前端页面)
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'jade')

// 日志记录中间件 📝
// app.use(logger('dev'))
// 解析请求体中间件
app.use(express.json()) // 解析post json参数
app.use(express.urlencoded({ extended: false })) // 解析post x-www-form-urlencoded参数
// 解析cookie中间件
app.use(cookieParser())
// 静态文件中间件
// app.use(express.static(path.join(__dirname, 'public')))

const redisClient = require('./db/myredis')
const sessionStore = new RedisStore({
  client: redisClient,
})

const ENV = process.env.NODE_ENV
if (ENV === 'production') {
  // 开发环境 / 测试环境
  app.use(logger('dev'))
} else {
  // 线上环境
  const logFileName = path.join(__dirname, 'logs', 'access.log')
  const writeStream = fs.createWriteStream(logFileName, {
    flags: 'a',
  })
  app.use(
    logger('combined', {
      stream: writeStream,
    })
  )
}
// session中间件
app.use(
  session({
    secret: 'myBlog88**', // 加密字符串，任意
    cookie: {
      path: '/',
      httpOnly: true, // 只能通过http请求获取，不能通过js获取
      secure: false, // 是否只通过https请求获取
      maxAge: 60 * 60 * 1000, // 过期时间，单位毫秒
    }, // 过期时间，单位毫秒
    resave: false, // 是否重新保存
    saveUninitialized: true, // 初始化
    store: sessionStore,
  })
)

// 路由中间件
// app.use('/', indexRouter)
// app.use('/users', usersRouter)
app.use('/api/blog', blogRouter) // api/blog/xxx 父路由 + 子路由
app.use('/api/user', userRouter)

// catch 404 and forward to error handler
// 404中间件，当找不到路由时，会执行这个中间件
app.use(function (req, res, next) {
  next(createError(404))
})

// error handler
// 错误处理中间件
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message
  res.locals.error = req.app.get('env') === 'development' ? err : {}

  // render the error page
  res.status(err.status || 500)
  res.render('error')
})

module.exports = app
